package stage_1_module_4.code.homework_4;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;


/**
 *  *  使用基于 tcp 协议的编程模型实现将 UserMessage 类型对象由客户端发送给服务器； 
  服务器接收到对象后判断用户对象信息是否为"admin"和 "123456"，若是则将UserMessage对象中的类型改为"success"，否则将类型改为"fail"并回发给客户端，客户端接收到服务器发来的对象后判断并给出登录成功或者失败的提示。 
  其中 UserMessage 类的特征有：类型(字符串类型) 和 用户对象(User 类型)。 
  其中 User类的特征有：用户名、密码(字符串类型)。 
  如： 
UserMessage tum = new UserMessage("check", new User("admin", "123456"));  
 */
/**
 * 思路:
 * 1.服务端启动socket端口并等待连接
 * 2.声明对象输入流，读取socket输入流中的对象obj
 * 3.如果对象是UserMessage类型，声明inobj转换obj为UserMessage对象，判断其中User对象的用户名是否为admin,密码是否为123456
 * 4.如果验证成功，设置inobj的类型字段为success,否则设置为fail
 * 5.声明对象输出流oos,输出对象inobj到socket的outputstream
 * 6.如果验证成功或超过3次机会，则退出验证
 * 7.关闭各种连接
 * 
 */
public class Server {
    public static void main(String[] args) {
        ServerSocket ss = null;
        Socket s = null;
        ObjectInputStream ois = null;
        ObjectOutputStream oos = null;
        int trycount = 0;
        try {
            ss = new ServerSocket(8899);
            System.out.println("服务端启动");
            while(true) {
                if (trycount >=3) {
                    System.out.println("超过失败次数");
                    break;
                }
                s = ss.accept();
                ois = new ObjectInputStream(s.getInputStream());
                Object obj = ois.readObject();
                if (obj instanceof UserMessage) {
                    UserMessage inobj = (UserMessage) obj;
                    oos = new ObjectOutputStream(s.getOutputStream());
                    if (inobj.getUser().getUsername().equals("admin")&& inobj.getUser().getPassword().equals("123456")) {
                        inobj.setType("success");
                        System.out.println("验证成功");
                        oos.writeObject(inobj);
                        break;
                    } else {
                        inobj.setType("fail");
                        oos.writeObject(inobj);

                        System.out.println("验证失败"+inobj.getUser().getUsername()+":"+inobj.getUser().getPassword());
                    }
                }
                trycount++;
            }

        } catch (IOException | ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (null != ss) {
                try {
                    ss.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (null != s) {
                try {
                    s.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (null != ois) {
                try {
                    ois.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}
